﻿using System;
using System.Data;
using System.Data.Linq;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;
using System.Web.Services;


namespace Emporium_Web
{
    public partial class PackingDetalle : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de Pedido de Compra
        /// </summary>
        private int PackingId
        {
            get { return ViewState["PackingId"] == null ? -1 : (int)ViewState["PackingId"]; }
            set { ViewState["PackingId"] = value; }
        }

        private int PackingCajaId
        {
            get { return ViewState["PackingCajaId"] == null ? -1 : (int)ViewState["PackingCajaId"]; }
            set { ViewState["PackingCajaId"] = value; }
        }

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        }

        /// <summary>
        /// Es el código del Detalle Seleccionado
        /// </summary>
        private int DetalleId
        {
            get { return Session["DetalleId"] == null ? -1 : (int)Session["DetalleId"]; }
            set { Session["DetalleId"] = value; }
        }

        /// <summary>
        /// Es el código del Cliente Seleccionado
        /// </summary>
        private int ClienteId
        {
            get { return Session["ClienteId"] == null ? -1 : (int)Session["ClienteId"]; }
            set { Session["ClienteId"] = value; }
        }


        private List<PR_PackingCaja> PackingCajaTemp
        {
            get
            {
                return Session["PackingCajaTemp"] == null ? null : (List<PR_PackingCaja>)Session["PackingCajaTemp"];
            }
            set
            {
                Session["PackingCajaTemp"] = value;
            }
        }

       
        private List<PR_PackingPrenda> PackingPrendaTemp
        {
            get
            {
                return Session["PackingPrendaTemp"] == null ? null : (List<PR_PackingPrenda>)Session["PackingPrendaTemp"];
            }
            set
            {
                Session["PackingPrendaTemp"] = value;
            }
        }   

        protected void Page_Init(object sender, EventArgs e)
        {

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            warningMessage.Visible = false;
            errorMessage.Visible = false;

            try
            {              
                if (!IsPostBack)
                {
                    errorMessage.Visible = false;

                    Master.ActualizaMenu(MenuPrincipal.Produccion, (int)MenuProduccion.PackingList);
                    Master.AgregarBreadcrumb("Packing List", "#", true);
                    Master.AgregarBreadcrumb("Listado", "PackingList.aspx", false);

                    int packingId = 0;

                    if (Request.QueryString["PackingId"] != null && Int32.TryParse(Request.QueryString["PackingId"], out packingId))
                    {
                        this.PackingId = packingId;
                    }
                    else
                    {
                        this.PackingId = -1;
                    }
                    PackingCajaTemp = new List<PR_PackingCaja>();
                    ListarPackingCajas();
                    CargarPackingCajas();
                }               
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }       

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("PackingList.aspx");
        }
      


        #region Cajas

        private void ListarPackingCajas()
        {
            TablasDataContext database = new TablasDataContext();

            var listaCajas = from Cajas in database.PR_PackingCaja
                                    where Cajas.PacLis_Id == this.PackingId
                                    select Cajas;

            PackingCajaTemp = listaCajas.ToList();
        }

        private void CargarPackingCajas()
        {
            if (PackingCajaTemp.Count() > 0)
            {
                gvCajas.DataSource = PackingCajaTemp;
                gvCajas.DataBind();

               //this.TotalPorcion = PackingCajaTemp.Sum(c => c.PacEst_Prendas);
            }
            else
            {
                gvCajas.DataSource = new List<PR_PackingCaja>() { new PR_PackingCaja() };
                gvCajas.DataBind();
                gvCajas.SelectedIndex = -1;

                for (int i = 0; i < gvCajas.Rows[0].Cells.Count; i++)
                {
                    gvCajas.Rows[0].Cells[i].Text = "";
                }
            }
            CargarOrdenes();
            CargarEstilos();
        }

        private void CargarOrdenes()
        {
            TablasDataContext database = new TablasDataContext();
            List<PR_OrdenProduccion> lstOrdenes = new List<PR_OrdenProduccion>();

            if (PackingCajaTemp.Count() == 0)
            {
                for (int i = 0; i < gvCajas.Rows[0].Cells.Count; i++)
                {
                    gvCajas.Rows[0].Cells[i].Text = "";
                }
            }

            var listarQuery = from ordenes in database.PR_OrdenProduccion
                              select ordenes;

            var estilos = database.PR_PackingEstilo.ToList().FindAll(c => c.PacLis_Id == this.PackingId);

            foreach (var item in listarQuery)
            {
                if (estilos.Exists(c => c.Estilo_Id == item.Estilo_Id))
                {
                    if (!lstOrdenes.Exists(c => c.OrdPro_Id == item.OrdPro_Id))
                    {
                        lstOrdenes.Add(new PR_OrdenProduccion()
                        {
                            OrdPro_Descripcion = item.OrdPro_Id.ToString("00000")
                        });
                    }
                }
            }

            DropDownList ddlOrdenProduccionNew = ((DropDownList)gvCajas.FooterRow.FindControl("ddlOrdenProduccionNew"));
            ddlOrdenProduccionNew.DataSource = lstOrdenes.ToList();
            ddlOrdenProduccionNew.DataValueField = "OrdPro_Descripcion";
            ddlOrdenProduccionNew.DataTextField = "OrdPro_Descripcion";
            ddlOrdenProduccionNew.DataBind();
            ddlOrdenProduccionNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlOrdenProduccionNew.SelectedValue = "0";
        }

        private void CargarEstilos()
        {
            TablasDataContext database = new TablasDataContext();

            List<DE_Estilo> lstEstilos = new List<DE_Estilo>();

            var listarQuery = from Estilos in database.PR_PackingEstilo                             
                              select Estilos;

            foreach (var item in listarQuery)
                if (!lstEstilos.Exists(c => c.Id == item.Estilo_Id))
                {
                    lstEstilos.Add(new DE_Estilo()
                    {
                        Id = item.Estilo_Id,
                        Descripcion = item.DE_Estilo.Descripcion
                    });
                }


            DropDownList ddlEstiloNew = ((DropDownList)gvCajas.FooterRow.FindControl("ddlEstiloNew"));
            ddlEstiloNew.DataSource = lstEstilos.ToList();
            ddlEstiloNew.DataValueField = "Id";
            ddlEstiloNew.DataTextField = "Descripcion";
            ddlEstiloNew.DataBind();
            ddlEstiloNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlEstiloNew.SelectedValue = "0";
        }

        protected void ddlOrdenProduccion_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                TablasDataContext database = new TablasDataContext();

                if (PackingCajaTemp.Count() == 0)
                {
                    for (int i = 0; i < gvCajas.Rows[0].Cells.Count; i++)
                    {
                        gvCajas.Rows[0].Cells[i].Text = "";
                    }
                }

                DropDownList ddlOrdenProduccionNew = ((DropDownList)gvCajas.FooterRow.FindControl("ddlOrdenProduccionNew"));
                DropDownList ddlEstiloNew = ((DropDownList)gvCajas.FooterRow.FindControl("ddlEstiloNew"));

                if (ddlOrdenProduccionNew.SelectedValue == "0")
                {
                    ddlEstiloNew.Enabled = true;
                }
                else
                {
                    var orden = database.PR_OrdenProduccion.FirstOrDefault(c=>c.OrdPro_Id == Convert.ToInt32(ddlOrdenProduccionNew.SelectedValue));  
                    ddlEstiloNew.Enabled = false;
                    ddlEstiloNew.SelectedValue = orden.Estilo_Id.ToString();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }           
        }

        #endregion
        private void ActualizarSeleccionGrilla(GridView gv)
        {
            if (gv.SelectedIndex > -1)
                foreach (GridViewRow row in gv.Rows)
                {
                    if (row.Cells[0].Controls.Count > 0)
                    {
                        ImageButton img = (ImageButton)row.Cells[0].Controls[0];
                        if ((row.RowIndex == gv.SelectedIndex))
                        {
                            img.ImageUrl = @"~/images/selected.png";
                        }
                        else
                        {
                            img.ImageUrl = @"~/images/unselected.png";
                        }
                    }
                }
        }

        protected void gvCajas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.Equals("Insert"))
                {
                    DropDownList ddlOrdenProduccionNew = ((DropDownList)gvCajas.FooterRow.FindControl("ddlOrdenProduccionNew"));
                    DropDownList ddlEstiloNew = ((DropDownList)gvCajas.FooterRow.FindControl("ddlEstiloNew"));
                    TextBox txtPrendasNew = (TextBox)gvCajas.FooterRow.FindControl("txtPrendasNew");
                    TextBox txtPesoNew = (TextBox)gvCajas.FooterRow.FindControl("txtPesoNew");

                    int? ordenProduccion = null;
                    if (ddlOrdenProduccionNew.SelectedValue != "0")
                    {
                        ordenProduccion = Convert.ToInt32(ddlOrdenProduccionNew.SelectedValue);
                    }
                    int? estilo = null;
                    if (ddlEstiloNew.SelectedValue != "0")
                    {
                        estilo = Convert.ToInt32(ddlEstiloNew.SelectedValue);
                    }
                    int prendas = Convert.ToInt32(txtPrendasNew.Text);
                    decimal peso = Convert.ToDecimal(txtPesoNew.Text);

                    //if (PackingCajaTemp.Exists(c => c.OrdPro_Id == ordenProduccion && c.Estilo_Id == estilo))
                    //{
                    //    lblWarningMessage.Text = "Combinación de Orden Compra y Estilo ya existe en el listado";
                    //    warningMessage.Visible = true;
                    //    return;
                    //}

                    TablasDataContext database = new TablasDataContext();

                    var packingCaja = new PR_PackingCaja();

                    packingCaja.Estilo_Id = estilo;
                    packingCaja.OrdPro_Id = ordenProduccion;
                    packingCaja.PacCaj_Prendas = prendas;
                    packingCaja.PacCaj_PesoBruto = peso;
                    packingCaja.PacCaj_Secuencia = PackingCajaTemp.Count + 1;
                    packingCaja.PacLis_Id = this.PackingId;
                    packingCaja.PacCaj_Estado = 'A';

                    database.PR_PackingCaja.InsertOnSubmit(packingCaja);
                    database.SubmitChanges();

                    ListarPackingCajas();
                    CargarPackingCajas();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvCajas_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //TablasDataContext database = new TablasDataContext();
                //var packingCaja = (PR_PackingCaja)(e.Row.DataItem);                
                //Label lblCliente = (Label)e.Row.FindControl("lblCliente");

                //var objCaja = database.CO_PedidoCaja.FirstOrDefault(c => c.PedCom_Id == 0 && c.Caja_Id == packingCaja.Caja_Id);
                //if (objCaja != null)
                //{
                //    lblCliente.Text = objCaja.PedEst_CodigoCliente;
                //}
            }
        }

        [WebMethod]
        public static void ActualizarPrendas(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                PackingForm pagina = new PackingForm();

                var Cajas = (List<Emporium_Web.DBML.PR_PackingCaja>)pagina.Session["PackingCajaTemp"];

                var CajaDetalle = Cajas.Find(c => c.PacCaj_Secuencia == id);
                CajaDetalle.PacCaj_Prendas = Convert.ToInt32(cantidad);
            }
        }

        [WebMethod]
        public static void ActualizarPeso(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                PackingForm pagina = new PackingForm();

                var Cajas = (List<Emporium_Web.DBML.PR_PackingCaja>)pagina.Session["PackingCajaTemp"];

                var CajaDetalle = Cajas.Find(c => c.PacCaj_Secuencia == id);
                CajaDetalle.PacCaj_PesoBruto = Convert.ToDecimal(cantidad);                
            }
        }

        protected void gvCajas_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                TablasDataContext database = new TablasDataContext();

                int secuencia = Convert.ToInt32(e.Keys["PacCaj_Secuencia"]);
                
                var caja = database.PR_PackingCaja.ToList().Find(c => c.PacLis_Id == this.PackingId && c.PacCaj_Secuencia == secuencia);
                var cajas = database.PR_PackingCaja.ToList().FindAll(c => c.PacLis_Id == this.PackingId);

                database.PR_PackingCaja.DeleteOnSubmit(caja);

                for (int i = 0; i < cajas.Count; i++)
                    cajas[i].PacCaj_Secuencia = i + 1;

                database.SubmitChanges();

                ListarPackingCajas();
                CargarPackingCajas();                
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        private void CargarEstilosPrendas()
        {
            TablasDataContext database = new TablasDataContext();

            List<DE_Estilo> lstEstilos = new List<DE_Estilo>();

            var listarQuery = from Estilos in database.PR_PackingEstilo
                              select Estilos;

            foreach (var item in listarQuery)
                if (!lstEstilos.Exists(c => c.Id == item.Estilo_Id))
                {
                    lstEstilos.Add(new DE_Estilo()
                    {
                        Id = item.Estilo_Id,
                        Descripcion = item.DE_Estilo.Descripcion
                    });
                }


            DropDownList ddlEstiloNew = ((DropDownList)gvPrendas.FooterRow.FindControl("ddlEstiloNew"));
            ddlEstiloNew.DataSource = lstEstilos.ToList();
            ddlEstiloNew.DataValueField = "Id";
            ddlEstiloNew.DataTextField = "Descripcion";
            ddlEstiloNew.DataBind();
            ddlEstiloNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlEstiloNew.SelectedValue = "0";
        }

        protected void gvPrendas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            try
            {
                

                if (e.CommandName.Equals("Insert"))
                {
                    var caja = database.PR_PackingCaja.FirstOrDefault(c => c.PacCaj_Id == this.PackingCajaId);

                    DropDownList ddlEtiquetaNew = ((DropDownList)gvPrendas.FooterRow.FindControl("ddlEtiquetaNew"));
                    DropDownList ddlTallaNew = ((DropDownList)gvPrendas.FooterRow.FindControl("ddlTallaNew"));
                    TextBox txtPrendasNew = (TextBox)gvPrendas.FooterRow.FindControl("txtPrendasNew");
                  
                    
                    var packingPrenda = new PR_PackingPrenda();

                    packingPrenda.Estilo_Id = caja.Estilo_Id.Value;
                    packingPrenda.OrdPro_Id = caja.OrdPro_Id.Value;
                    packingPrenda.PacPre_Prendas = Convert.ToInt32(txtPrendasNew.Text);
                    packingPrenda.Talla_Id = Convert.ToInt32(ddlTallaNew.SelectedValue);
                    packingPrenda.PacPre_Talla = ddlTallaNew.SelectedItem.Text;
                    packingPrenda.Combinacion_Id = Convert.ToInt32(ddlEtiquetaNew.SelectedValue);
                    packingPrenda.PacPre_Etiqueta = ddlEtiquetaNew.SelectedItem.Text;
                    packingPrenda.PacCaj_Id = caja.PacCaj_Id;
                    packingPrenda.PacLis_Id = caja.PacLis_Id;

                    database.PR_PackingPrenda.InsertOnSubmit(packingPrenda);

                    //Se actualiza el acumulado

                    var acumulado = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.Actividad_Id == 28
                                                                                   && c.OrdPro_Id == caja.OrdPro_Id
                                                                                   && c.Combinacion_Id == packingPrenda.Combinacion_Id
                                                                                   && c.Talla_Id == packingPrenda.Talla_Id);

                    acumulado.MovAcu_Proceso += packingPrenda.PacPre_Prendas;

                    database.SubmitChanges();

                    ListarPackingPrendas();
                    CargarPackingPrendas();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvPrendas_RowDataBound(object sender, GridViewRowEventArgs e)
        {

        }

        protected void gvPrendas_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {

        }

        private void ListarPackingPrendas()
        {
            TablasDataContext database = new TablasDataContext();

            var listaPrendas = from prendas in database.PR_PackingPrenda
                             where prendas.PacLis_Id == this.PackingId &&
                                   prendas.PacCaj_Id == this.PackingCajaId
                             select prendas;

            PackingPrendaTemp = listaPrendas.ToList();
        }

        private void CargarPackingPrendas()
        {
            if (PackingPrendaTemp.Count() > 0)
            {
                gvPrendas.DataSource = PackingPrendaTemp;
                gvPrendas.DataBind();                
            }
            else
            {
                gvPrendas.DataSource = new List<PR_PackingPrenda>() { new PR_PackingPrenda() };
                gvPrendas.DataBind();
                gvPrendas.SelectedIndex = -1;

                for (int i = 0; i < gvPrendas.Rows[0].Cells.Count; i++)
                {
                    gvPrendas.Rows[0].Cells[i].Text = "";
                }
            }
            CargarEtiquetas();
        }


        private void CargarEtiquetas()
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Combinacion> listaEtiqueta = new List<TG_Combinacion>();

            var caja = database.PR_PackingCaja.FirstOrDefault(c => c.PacCaj_Id == this.PackingCajaId);


            var listAcumulado = (from acumulado in database.PR_MovimientoAcumulado                                 
                                 where acumulado.OrdPro_Id == caja.OrdPro_Id
                                 && acumulado.Estilo_Id == caja.Estilo_Id
                                 && acumulado.MovAcu_Ingreso - acumulado.MovAcu_Proceso - acumulado.MovAcu_Merma > 0
                                 && acumulado.Actividad_Id == 28
                                 select acumulado);

            if (PackingCajaTemp.Count() == 0)
            {
                for (int i = 0; i < gvCajas.Rows[0].Cells.Count; i++)
                {
                    gvCajas.Rows[0].Cells[i].Text = "";
                }
            }

            foreach (var item in listAcumulado)
            {
                if (!listaEtiqueta.Exists(c => c.Combinacion_Id == item.Combinacion_Id))
                {
                    listaEtiqueta.Add(new TG_Combinacion()
                    {
                        Combinacion_Id = item.Combinacion_Id,
                        Combinacion_Descripcion = item.MovAcu_Color.ToUpper()
                    });
                }
            }

            DropDownList ddlEtiquetaNew = ((DropDownList)gvPrendas.FooterRow.FindControl("ddlEtiquetaNew"));
            ddlEtiquetaNew.DataSource = listaEtiqueta;
            ddlEtiquetaNew.DataValueField = "Combinacion_Id";
            ddlEtiquetaNew.DataTextField = "Combinacion_Descripcion";
            ddlEtiquetaNew.DataBind();
            ddlEtiquetaNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlEtiquetaNew.SelectedValue = "0";          
        }


        private void CargarTallas()
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Talla> listaTalla = new List<TG_Talla>();

            DropDownList ddlEtiquetaNew = ((DropDownList)gvPrendas.FooterRow.FindControl("ddlEtiquetaNew"));
            int combinacionId = 0;
            if (ddlEtiquetaNew != null && ddlEtiquetaNew.SelectedValue != "")
                combinacionId = Convert.ToInt32(ddlEtiquetaNew.SelectedValue);

            var caja = database.PR_PackingCaja.FirstOrDefault(c => c.PacCaj_Id == this.PackingCajaId);


            var listAcumulado = (from acumulado in database.PR_MovimientoAcumulado
                                 where acumulado.OrdPro_Id == caja.OrdPro_Id
                                 && acumulado.Estilo_Id == caja.Estilo_Id
                                 && acumulado.MovAcu_Ingreso - acumulado.MovAcu_Proceso - acumulado.MovAcu_Merma > 0
                                 && acumulado.Actividad_Id == 28
                                 && acumulado.Combinacion_Id == combinacionId
                                 select acumulado);

            if (PackingCajaTemp.Count() == 0)
            {
                for (int i = 0; i < gvCajas.Rows[0].Cells.Count; i++)
                {
                    gvCajas.Rows[0].Cells[i].Text = "";
                }
            }

            foreach (var item in listAcumulado)
            {
                if (!listaTalla.Exists(c => c.Talla_Id == item.Talla_Id))
                {
                    listaTalla.Add(new TG_Talla()
                    {
                        Talla_Id = item.Talla_Id,
                        Talla_DescripcionCorta = item.MovAcu_Talla.ToUpper()
                    });
                }
            }

            DropDownList ddlTallaNew = ((DropDownList)gvPrendas.FooterRow.FindControl("ddlTallaNew"));
            ddlTallaNew.DataSource = listaTalla;
            ddlTallaNew.DataValueField = "Talla_Id";
            ddlTallaNew.DataTextField = "Talla_DescripcionCorta";
            ddlTallaNew.DataBind();
            ddlTallaNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlTallaNew.SelectedValue = "0";
        }

        protected void gvCajas_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PackingCajaId = (int)gvCajas.DataKeys[gvCajas.SelectedIndex]["PacCaj_Id"];

            ListarPackingPrendas();
            CargarPackingPrendas();
        }

        protected void ddlEtiqueta_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (PackingPrendaTemp.Count == 0)
                for (int i = 0; i < gvPrendas.Rows[0].Cells.Count; i++)
                    gvPrendas.Rows[0].Cells[i].Text = "";
            
            CargarTallas();
        }        
    }
}